package com.aaa.power.service.impl;

import com.aaa.common.constant.ExceptionConstant;
import com.aaa.common.constant.ReturnCode;
import com.aaa.common.util.CustomException;
import com.aaa.common.util.Result;
import com.aaa.power.dao.RoleDao;
import com.aaa.power.entity.Role;
import com.aaa.power.service.RoleService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 角色信息表(Role)表服务实现类
 *
 * @author makejava
 * @since 2020-11-10 13:52:31
 */
@Service("roleService")
public class RoleServiceImpl implements RoleService {
    @Resource
    private RoleDao roleDao;
    @Autowired
    private HttpSession session;
    /**
     * 通过ID查询该条数据
     *
     * @param roleId 主键
     * @return 实例对象
     */
    @Override
    public Role queryById(Integer roleId) {
        return this.roleDao.queryById(roleId);
    }

    /**
     * 根据角色id查询所有权限
     * @param roleId
     * @return
     */
    @Override
    public List<Integer> queryByIdToMenu(Integer roleId) {
        return this.roleDao.queryByIdToMenu(roleId);
    }

    /**
     * 分页+名字模糊查讯
     * @param pageNo
     * @param pageSize
     * @param role
     * @return
     */
    @Override
    public Result queryPageByParam(Integer pageNo, Integer pageSize, Role role) {
        if(pageNo==null||pageSize==null){
            throw new CustomException(ExceptionConstant.INVALID_ARGUMENT.getErrorCode(),
                    ExceptionConstant.INVALID_ARGUMENT.getErrorMessage());
        }
        //分页
        PageHelper.startPage(pageNo,pageSize);
        PageInfo<Role> pageInfo = new PageInfo<Role>(roleDao.queryAll(role));
        //        Map rmap  = new HashMap();
        //        rmap.put("total",pageInfo.getTotal());
        //        rmap.put("page",pageInfo.getList());
        return new Result(ReturnCode.SUCCESSS.getCode(),
                ReturnCode.SUCCESSS.getMsg(),pageInfo);
    }

    /**
     * 根据角色id和菜单id给角色分配权限
     * @param roleId
     * @param menuIds
     * @return
     */
    @Override
    public Integer insertByIdToMenus(Integer roleId, String menuIds) {
        //删除角色的所有权限
        int delete =roleDao.deleteByIdToMenus(roleId);
        //判断删除是否成功和menuIds是否为空
        int insert=0;
        if(delete>=0&&!StringUtils.isEmpty(menuIds)){
            //new一个list存放每一个menuId
            List<Map> menuList=new ArrayList<>();
            //以，为分隔标记分割，获得每一个menuId
            String[] menus = menuIds.split(",");
            //循环遍每一个menuId,并添加到menulist中
            for (String menuId : menus) {
                System.out.println(menuId);
                Map map=new HashMap();
                map.put("roleId",roleId);
                map.put("menuId",menuId);
                menuList.add(map);
            }
            //执行添加
            insert= roleDao.insertRoleAndMenu(menuList);
        }
        //添加成功返回1，失败返回0
        if(insert>0)return 1;
            return 0;
    }

    /**
     * 新增数据
     *
     * @param role 实例对象
     * @return 实例对象
     */
    @Override
    public Role insert(Role role) {
        //把操作人的名字从session中取出存到数据库中
        role.setCreateBy((String) session.getAttribute("username"));
        role.setRoleKey("default");
        role.setRoleSort(1);
        role.setDataScope("1");
        role.setDelFlag("0");
        this.roleDao.insert(role);
        return role;
    }

    /**
     * 修改数据
     *
     * @param role 实例对象
     * @return 实例对象
     */
    @Override
    public Role update(Role role) {
        //设置日期格式
        SimpleDateFormat updateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // new Date()为获取当前系统时间
        role.setUpdateTime(updateTime.format(new Date()));
        role.setUpdateBy((String) session.getAttribute("username"));
        this.roleDao.update(role);
        return this.queryById(role.getRoleId());
    }

    /**
     * 通过主键删除数据
     *
     * @param roleId 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer roleId) {
        return this.roleDao.deleteById(roleId) > 0;
    }

    /**
     * 查询所有
     * @param role 实例对象
     * @return
     */
    @Override
    public List<Role> queryAll(Role role) {
        return roleDao.queryAll(role);
    }
}